package course.d1229;
/*
     线程之间的通信
     Object类中的方法：
     1.public final void wait () throw InterruptedException
       在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前，导致当前线程等待。
     换句话说，此方法的行为就好像它仅执行 wait(0) 调用一样。
     2.public final void notify()
       唤醒在此对象监视器上等待的单个线程。

     步骤：
     1.创建一个顾客线程（消费者）：告知老板要的包子种类和数量，调用wait（）方法，放弃cup，进入等待状态
     2.创建一个老板线程（生产者）：花了3秒做包子，做好包子后，调用notify（），唤醒顾客次包子

     注意：
     顾客和老板线程线程必须使用同步技术，保证两个线程只有一个在 执行
     同步使用同步代码块，锁对象是唯一的
     只有锁对象才可以调用 wait和 notify方法

 */
public class p1 {
    public static void main(String[] args) {
        //创建一个锁对象，锁对象唯一
        Object obj = new Object();
        //创建一个顾客线程
        new Thread(){
            @Override
            public void run() {
                while (true){
                    //使用同步代码块
                    synchronized (obj){
                        System.out.println("告知老板买包子的种类和数量");
                        //进去等待状态
                        try {
                            obj.wait();
                            //顾客被唤醒后执行的代码
                            System.out.println("包子做好了，开始吃了");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                }
            }
        }.start();

        //创建一个老板线程
        new Thread(){
            @Override
            public void run() {
                while (true){
                    //老板需要3秒做包子
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (obj){
                        System.out.println("老板3秒做好包子，告诉顾客可以吃包子了");
                        //包子做好了，通知顾客吃包子
                        obj.notify();
                    }

                }
            }
        }.start();

    }
}
